package com.fh.modules.system.controller;

import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fh.common.api.vo.Result;
import com.fh.common.aspect.annotation.AutoLog;
import com.fh.common.constant.CommonConstant;
import com.fh.common.constant.CommonSendStatus;
import com.fh.common.constant.Constant;
import com.fh.common.util.ConvertUtils;
import com.fh.common.web.AbstractController;
import com.fh.modules.system.entity.SysAnnouncement;
import com.fh.modules.system.entity.SysAnnouncementSend;
import com.fh.modules.system.entity.SysUser;
import com.fh.modules.system.service.ISysAnnouncementSendService;
import com.fh.modules.system.service.ISysAnnouncementService;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

/**
 * @author Qiu,Junda
 * @date 2019年4月3日
 * @description 系统通告表
 */
@RestController
@RequestMapping("/sys/annountCement")
@Api("公告")
public class SysAnnouncementController extends AbstractController {
	@Autowired
	private ISysAnnouncementService sysAnnouncementService;
	
	@Autowired
	private ISysAnnouncementSendService sysAnnouncementSendService;

	/**
	 * 分页列表查询
	 * 
	 * @param sysAnnouncement
	 * @param pageNo
	 * @param pageSize
	 * @param req
	 * @return
	 */
	@ApiOperation("分页查询公告接口")
	@AutoLog(value="分页查询公告接口",logType=CommonConstant.LOG_TYPE_QUERY)
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public Result<IPage<SysAnnouncement>> queryPageList(SysAnnouncement sysAnnouncement,
			@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
			@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) {
		Result<IPage<SysAnnouncement>> result = new Result<IPage<SysAnnouncement>>();
		sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0);
		QueryWrapper<SysAnnouncement> queryWrapper = new QueryWrapper<SysAnnouncement>(sysAnnouncement);
		Page<SysAnnouncement> page = new Page<SysAnnouncement>(pageNo, pageSize);
		// 排序逻辑 处理
		String column = req.getParameter("column");
		String order = req.getParameter("order");
		if (ConvertUtils.isNotEmpty(column) && ConvertUtils.isNotEmpty(order)) {
			if (Constant.ORDER_ASC.equals(order)) {
				queryWrapper.orderByAsc(ConvertUtils.camelToUnderline(column));
			} else {
				queryWrapper.orderByDesc(ConvertUtils.camelToUnderline(column));
			}
		}
		IPage<SysAnnouncement> pageList = sysAnnouncementService.page(page, queryWrapper);
		result.setSuccess(true);
		result.setResult(pageList);
		return result;
	}

	/**
	 * 添加
	 * 
	 * @param sysAnnouncement
	 * @return
	 */
	@ApiOperation("添加公告接口")
	@RequestMapping(value = "/add", method = RequestMethod.POST)
	@AutoLog("添加公告")
	public Result<SysAnnouncement> add(@RequestBody SysAnnouncement sysAnnouncement) {
		Result<SysAnnouncement> result = new Result<SysAnnouncement>();
		try {
			sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0);
			// 未发布
			sysAnnouncement.setSendStatus(CommonSendStatus.UNPUBLISHED_STATUS_0);
			sysAnnouncementService.save(sysAnnouncement);
			result.success("添加成功！");
		} catch (Exception e) {
			e.printStackTrace();
			log.info(e.getMessage());
			result.error500("操作失败");
		}
		return result;
	}

	/**
	 * 编辑
	 * 
	 * @param sysAnnouncement
	 * @return
	 */
	@ApiOperation("修改公告接口")
	@AutoLog("修改公告")
	@RequestMapping(value = "/edit", method = RequestMethod.PUT)
	public Result<SysAnnouncement> eidt(@RequestBody SysAnnouncement sysAnnouncement) {
		Result<SysAnnouncement> result = new Result<SysAnnouncement>();
		SysAnnouncement sysAnnouncementEntity = sysAnnouncementService.getById(sysAnnouncement.getId());
		if (sysAnnouncementEntity == null) {
			result.error500("未找到对应实体");
		} else {
			boolean ok = sysAnnouncementService.updateById(sysAnnouncement);
			if (ok) {
				result.success("修改成功!");
			}
		}

		return result;
	}

	/**
	 * 通过id删除
	 * 
	 * @param id
	 * @return
	 */
	@ApiOperation("删除公告")
	@AutoLog("删除公告")
	@RequestMapping(value = "/delete", method = RequestMethod.DELETE)
	public Result<SysAnnouncement> delete(@RequestParam(name = "id", required = true) String id) {
		Result<SysAnnouncement> result = new Result<SysAnnouncement>();
		SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id);
		if (sysAnnouncement == null) {
			result.error500("未找到对应实体");
		} else {
			sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_1);
			boolean ok = sysAnnouncementService.updateById(sysAnnouncement);
			if (ok) {
				result.success("删除成功!");
			}
		}

		return result;
	}

	/**
	 * 批量删除
	 * 
	 * @param ids
	 * @return
	 */
	@ApiOperation("批量删除公告")
	@AutoLog("批量删除公告")
	@RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE)
	public Result<SysAnnouncement> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
		Result<SysAnnouncement> result = new Result<SysAnnouncement>();
		if (ids == null || "".equals(ids.trim())) {
			result.error500("参数不识别！");
		} else {
			String[] id = ids.split(",");
			for (int i = 0; i < id.length; i++) {
				SysAnnouncement announcement = sysAnnouncementService.getById(id[i]);
				announcement.setDelFlag(CommonConstant.DEL_FLAG_1);
				sysAnnouncementService.updateById(announcement);
			}
			result.success("删除成功!");
		}
		return result;
	}

	/**
	 * 通过id查询
	 * 
	 * @param id
	 * @return
	 */
	@RequestMapping(value = "/queryById", method = RequestMethod.GET)
	@AutoLog(value="根据id查询公告",logType=CommonConstant.LOG_TYPE_QUERY)
	public Result<SysAnnouncement> queryById(@RequestParam(name = "id", required = true) String id) {
		Result<SysAnnouncement> result = new Result<SysAnnouncement>();
		SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id);
		if (sysAnnouncement == null) {
			result.error500("未找到对应实体");
		} else {
			result.setResult(sysAnnouncement);
			result.setSuccess(true);
		}
		return result;
	}

	/**
	 * 更新发布操作
	 * 
	 * @param id
	 * @return
	 */
	@ApiOperation("更新发布公告")
	@AutoLog("更新发布公告")
	@RequestMapping(value = "/doReleaseData", method = RequestMethod.GET)
	public Result<SysAnnouncement> doReleaseData(@RequestParam(name = "id", required = true) String id,
			HttpServletRequest request) {
		Result<SysAnnouncement> result = new Result<SysAnnouncement>();
		SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id);
		if (sysAnnouncement == null) {
			result.error500("未找到对应实体");
		} else {
			// 发布中
			sysAnnouncement.setSendStatus(CommonSendStatus.PUBLISHED_STATUS_1);
			sysAnnouncement.setSendTime(new Date());
			String currentUserName = this.getUserAccount();
			sysAnnouncement.setSender(currentUserName);
			boolean ok = sysAnnouncementService.updateById(sysAnnouncement);
			if (ok) {
				result.success("该系统通知发布成功");
			}
		}

		return result;
	}

	/**
	 * 更新撤销操作
	 * 
	 * @param id
	 * @return
	 */
	@ApiOperation("更新撤销公告")
	@AutoLog("更新撤销公告")
	@RequestMapping(value = "/doReovkeData", method = RequestMethod.GET)
	public Result<SysAnnouncement> doReovkeData(@RequestParam(name = "id", required = true) String id,
			HttpServletRequest request) {
		Result<SysAnnouncement> result = new Result<SysAnnouncement>();
		SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id);
		if (sysAnnouncement == null) {
			result.error500("未找到对应实体");
		} else {
			// 撤销发布
			sysAnnouncement.setSendStatus(CommonSendStatus.REVOKE_STATUS_2);
			sysAnnouncement.setCancelTime(new Date());
			boolean ok = sysAnnouncementService.updateById(sysAnnouncement);
			if (ok) {
				result.success("该系统通知撤销成功");
			}
		}

		return result;
	}
	
	/**
	 * @功能：补充用户数据，并返回系统消息
	 * @return
	 */
	@RequestMapping(value = "/listByUser", method = RequestMethod.GET)
	@AutoLog(value="查询系统消息",logType=CommonConstant.LOG_TYPE_QUERY)
	public Result<Map<String,Object>> listByUser() {
		Result<Map<String,Object>> result = new Result<Map<String,Object>>();
		SysUser sysUser = this.getUser();
		String userId = sysUser.getId();
		// 1.将系统消息补充到用户通告阅读标记表中
		Collection<String> anntIds = sysAnnouncementSendService.queryByUserId(userId);
		LambdaQueryWrapper<SysAnnouncement> querySaWrapper = new LambdaQueryWrapper<SysAnnouncement>();
		// 全部人员
		querySaWrapper.eq(SysAnnouncement::getMsgType,CommonConstant.MSG_TYPE_ALL); 
		// 未删除
		querySaWrapper.eq(SysAnnouncement::getDelFlag,CommonConstant.DEL_FLAG_0); 
		 //已发布
		querySaWrapper.eq(SysAnnouncement::getSendStatus, CommonConstant.HAS_SEND);
		querySaWrapper.notIn(SysAnnouncement::getId, anntIds);
		List<SysAnnouncement> announcements = sysAnnouncementService.list(querySaWrapper);
		if(announcements.size()>0) {
			for(int i=0;i<announcements.size();i++) {
				SysAnnouncementSend announcementSend = new SysAnnouncementSend();
				announcementSend.setAnntId(announcements.get(i).getId());
				announcementSend.setUserId(userId);
				announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG);
				sysAnnouncementSendService.save(announcementSend);
			}
		}
		// 2.查询用户未读的系统消息
		Page<SysAnnouncement> anntMsgList = new Page<SysAnnouncement>(0,5);
		//通知公告消息
		anntMsgList = sysAnnouncementService.querySysCementPageByUserId(anntMsgList,userId,"1");
		Page<SysAnnouncement> sysMsgList = new Page<SysAnnouncement>(0,5);
		//系统消息
		sysMsgList = sysAnnouncementService.querySysCementPageByUserId(sysMsgList,userId,"2");
		Map<String,Object> sysMsgMap = new HashMap<String, Object>(4);
		sysMsgMap.put("sysMsgList", sysMsgList.getRecords());
		sysMsgMap.put("sysMsgTotal", sysMsgList.getTotal());
		sysMsgMap.put("anntMsgList", anntMsgList.getRecords());
		sysMsgMap.put("anntMsgTotal", anntMsgList.getTotal());
		result.setSuccess(true);
		result.setResult(sysMsgMap);
		return result;
	}

}
